// Copyright 2004-2006 Castle Project - http://www.castleproject.org/
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

namespace Snooze.Controllers
{
	using System;
	using Castle.MonoRail.Framework;
	using Snooze.Model;
    using System.Reflection;
    using System.Diagnostics;

	[Layout("xml")]
	public class DALController : SmartDispatcherController
	{
		public void FindAll(string typeName, int depth)
		{
            PropertyBag["depth"] = depth;
            FindAll(typeName);
		}

        public void FindAll(string typeName)
        {
            Execute("FindAll", typeName, new object[] { });
        }

        public void FindById(string typeName, int id, int depth)
        {
            PropertyBag["depth"] = depth;
            FindById(typeName, id);
        }

        public void FindById(string typeName, int id)
        {
            Execute("FindById", typeName, new object[] { id });
            RenderView("findone");
        }

        private void Execute(string method, string typeName, object[] args)
        {
            Type type = typeof(Persistent).Assembly.GetType("Snooze.Model." + typeName);
            Type genericType = typeof(Repository<>);
            Type constructedType = genericType.MakeGenericType(type);
            object result = constructedType.InvokeMember(method, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args);

            PropertyBag["result"] = result;

            Trace.WriteLine("Execute: " + method);
        }
	}
}
